/**
 * \file niveau.h
 * \author Olivier.H Quentin.M Benjamin.D
 * \version 1
 * \date 25 mai 2010
 *
 * Fichier qui enumere toutes les fonctions qui gere les fichier textes niveau.
 *
 */
#ifndef _NIVEAU_
#define _NIVEAU_

#include <stdio.h>

/**
 * \struct sNIVEAU
 * \brief ceci represente le niveau (fond du jeu)
 *
 * Nous donnons toutes les caracteristiques d'un niveau dans ce fichier. (dimensions, cases ...)
 */
struct sNIVEAU
{
	char * cases; /*!< une case du niveau*/
	int dimX;	/*!< largeur*/
	int dimY;	/*!< hauteur*/
	int dimensionCase;	/*!< dimension d'une case en nombre de pixel*/
};
typedef struct sNIVEAU NIVEAU;	/*!< declarassion de la structure NIVEAU*/


    /* ACCESSEURS */

/**
 * \fn GetDimXNiveau(const NIVEAU *terrain)
 * \brief recupere la dimension (largeur) du niveau.
 *
 * \param terrain un niveau.
 * \return un entier contenant le nombre de caracteres qui composent la largeur du terrain.
 */
int GetDimXNiveau(const NIVEAU *terrain);

/**
 * \fn GetDimYNiveau(const NIVEAU *terrain)
 * \brief recupere la dimension (hauteur) du niveau.
 *
 * \param terrain un niveau.
 * \return un entier contenant le nombre de caractere composant la hauteur du niveau.
 */
int GetDimYNiveau(const NIVEAU *terrain);

/**
 * \fn GetCaseNiveau(const NIVEAU *terrain, int x, int y)
 * \brief permet de recupere le caractere disponible a la position (x,y) (terrain = tableau de caractere).
 *
 * \param terrain un niveau
 * \param x l'abscisse
 * \param y l'ordonne
 * \return le caractere du terrain qui se situe a la position (x,y).
 */
char GetCaseNiveau(const NIVEAU *terrain, const int x, const int y);

/**
 * \fn GetCaseNiveauPixel(const NIVEAU *terrain, int x, int y)
 * \brief permet de recupere le caractere disponible au pixel (x,y) (1 caractere = n pixels).
 *
 * \param terrain un niveau
 * \param x l'abscisse en pixel
 * \param y l'ordonne en pixel
 * \return le caractere concerne pa le pixel (x,y).
 */
char GetCaseNiveauPixel(const NIVEAU *terrain, const int x, const int y);

/**
 * \fn GetDimensionCaseNiveau(const NIVEAU *terrain)
 * \brief recupere la dimension d'une case du niveau.
 *
 * \param terrain un niveau.
 * \return un entier qui donne la dimansion d'une case.
 */
int GetDimensionCaseNiveau(const NIVEAU *terrain);


    /*  MUTATEURS */

/**
 * \fn void SetCaseNiveau(NIVEAU *niveau, const int x, const int y, const char caractere)
 * \brief permet de modifier le caractere situe a la positon (x,y)
 *
 * \param niveau un niveau
 * \param x l'abscisse
 * \param y l'ordonne
 * \param caractere le caractere que l'on veut mettre
 */
void SetCaseNiveau(NIVEAU *niveau, const int x, const int y, const char caractere);

/**
 * \fn void SetDimYNiveau(NIVEAU *niveau, const int x)
 * \brief permet de modifier la dimension en y du tableau
 *
 * \param niveau structure NIVEAU
 * \param x la taille y du niveau
 */
void SetDimYNiveau(NIVEAU *niveau, const int x);

/**
 * \fn void SetDimXNiveau(NIVEAU *niveau, const int x)
 * \brief permet de modifier la dimension en x du tableau
 *
 * \param niveau structure NIVEAU
 * \param x la taille x du niveau
 */
void SetDimXNiveau(NIVEAU *niveau, const int x);


    /*  AUTRES FONCTIONS */

/**
 * \fn int ConversionPixelCase(const int nombre, const NIVEAU *niveau)
 * \brief recupere la position en nombre de case.
 *
 * \param nombre la position en pixel
 * \param niveau un niveau
 * \return un entier qui donne la corespondance du pixel en case.
 */
int ConversionPixelCase(const int nombre, const NIVEAU *niveau);

/**
 * \fn int ConversionCasePixel(const int nombre, const NIVEAU *niveau)
 * \brief recupere la position en nombre de pixel.
 *
 * \param nombre la position de la case
 * \param niveau un niveau
 * \return un entier qui donne la corespondance de la case en pixel.
 */
int ConversionCasePixel(const int nombre, const NIVEAU *niveau);

/**
 * \fn NIVEAU* CreerNiveau()
 * \brief permet de creer un niveau en memoire
 *
 */
NIVEAU* CreerNiveau();

/**
 * \fn InitialiserNiveau(NIVEAU *terrain)
 * \brief permet d'initialiser tous les champs de la structure niveau.
 *
 * \param terrain un niveau.
 *
 */
void InitialiserNiveau(NIVEAU *terrain);

/**
 * \fn TestamentNiveau(NIVEAU **terrain)
 * \brief permet de suprimer un niveau de la memoire.
 *
 * \param terrain un niveau.
 *
 */
void TestamentNiveau(NIVEAU **terrain);

/**
 * \fn ChargerNiveau(NIVEAU *terrain, FILE *f)
 * \brief charge le fichier texte.
 *
 * \param terrain un niveau
 * \param f un fichier texte contenant le niveau
 */
void ChargerNiveau(NIVEAU *terrain, FILE *f);

/**
 * \fn FinNiveau(NIVEAU *terrain)
 * \brief supprime le niveau actuelle et remet les champs a zero (prepare a accueillir un nouveau niveau).
 *
 * \param terrain un niveau.
 *
 */
void FinNiveau(NIVEAU *terrain);

/**
 * \fn int EstUnMur(const NIVEAU *niveau, const int x, const int y)
 * \brief permet de tester si le caractere situee a la postion (x,y) est un mur.
 *
 * \param niveau un niveau
 * \param x l'abscisse en pixel
 * \param y l'ordonne en pixel
 * \return un entier qui stoque 1 si c'est un mur 0 sinon.
 */
int EstUnMur(const NIVEAU *niveau, const int x, const int y);

/**
 * \fn int EstUnPic(const NIVEAU *niveau, const int x, const int y)
 * \brief permet de tester si le caractere situee a la postion (x,y) est un pic.
 *
 * \param niveau un niveau
 * \param x l'abscisse en pixel
 * \param y l'ordonne en pixel
 * \return un entier qui stoque 1 si c'est un pic 0 sinon.
 */
int EstUnPic(const NIVEAU *niveau, const int x, const int y);

/**
 * \fn int EstUnPicOuUnMur(const NIVEAU *niveau, const int x, const int y)
 * \brief permet de tester si le caractere situee a la postion (x,y) est un pic ou un mur.
 *
 * \param niveau un niveau
 * \param x l'abscisse en pixel
 * \param y l'ordonne en pixel
 * \return un entier qui stoque 1 si c'est un pic ou un mur 0 sinon.
 */
int EstUnPicOuUnMur(const NIVEAU *niveau, const int x, const int y);

/**
 * \fn int EstEau(const NIVEAU *niveau, const int x, const int y)
 * \brief permet de tester si le caractere situee a la position x y est ~ qui signifie l'eau.
 *
 * \param niveau la structure NIVEAU
 * \param x l'abscisse en pixel
 * \param y l'ordonne en pixel
 * \return un entier 1 si la case est de l'eau, 0 si ce n'est pas le cas
 */
int EstEau(const NIVEAU *niveau, const int x, const int y);

#endif
